#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
using namespace std;
struct In
{
	int x,y,d,st;
}a[10001];
long long f[10001][2];
int n,m;
const long long MAXINT = 10000000000000000;
bool cmp(In a,In b)
{
	return a.y<b.y;
}
long long min(long long x,long long y)
{
	return x<y?x:y;
}
int main()
{
	freopen("test.in","r",stdin);
	scanf("%d%d",&n,&m);
	for(int i=1;i<=m;i++)
	{
		char c[20];
		scanf("%d%d%d%s",&a[i].x,&a[i].y,&a[i].d,c);
		switch(c[0])
		{
			case 'L':a[i].st=1;break;
			case 'P':a[i].st=3;break;
			case 'C':a[i].st=2;break;
		}
	}
	sort(a+1,a+m+1,cmp);
	memset(f,0,sizeof(f));
	int t=1;
	for(int i=2;i<=n;i++)
	{
		f[i][0]=f[i][1]=MAXINT;
		while(i==a[t].y)
		{
			if(a[t].st==1)f[i][1]=min(f[i][1],f[a[t].x][1]+a[t].d);
			if(a[t].st==2)
			{
				f[i][1]=min(f[i][1],f[a[t].x][1]+a[t].d);
				f[i][0]=min(f[i][0],f[a[t].x][0]+a[t].d);
			}
			if(a[t].st==3)
			{
				f[i][0]=min(f[i][0],f[a[t].x][0]+a[t].d);
				f[i][0]=min(f[i][0],f[a[t].x][1]+a[t].d);
			}

			t++;
		}
	}
	long long ans;
	if((ans=min(f[n][1],f[n][0]))<MAXINT)
		printf("Online\n%lld",ans);
	else printf("Offline\n");
	return 0;
}




	//for(int i=1;i<=m;i++)
	//	printf("%d %d %d %d\n",a[i].x,a[i].y,a[i].d,a[i].st);



	
	

